#ifndef GBN_CUDA_CUH
#define GBN_CUDA_CUH

#include "gbn_base_cuda.cuh"  // 包含 GBNBasePointSet 类声明
#include <cmath>
#include <stdexcept>
#include <string>
#include <iostream>
#include <vector>
using namespace std;

// -------------------------- 仅保留基类未定义的常量 --------------------------
// 通用优化常量
constexpr int PERIODS = 9;          // 高斯核9σ能量覆盖范围
template <typename Float = float>
constexpr Float DEFAULT_SIGMA = 1.0f;// 高斯核宽度默认值
constexpr int MAX_ITERATIONS = 10000;// 最大迭代次数

// 对应gbn0中的 ZERO/HALF/ONE，统一环形域坐标范围为 [0, 1),使用static_cast确保类型正确,
//如：static_cast<float>(GBN0_ONE),static_cast<double>(GBN0_HALF)
#define GBN0_ZERO 0.0f
#define GBN0_HALF 0.5f
#define GBN0_ONE  1.0f



// --------------------------  GBNPointSet 类声明 --------------------------
template <typename Float = float>
class GBNPointSet : public GBNBasePointSet<Float> {
public:
    Float sigma=DEFAULT_SIGMA<Float>;          // 高斯核带宽（核心优化参数，默认1.0）
    Float learning_rate=0.1f;        // 初始学习率（默认0.1）
    int max_iterations=MAX_ITERATIONS; // 最大迭代次数（默认10000）

    // ================================= 构造与析构函数 =================================
    /**
     * 构造函数：复用基类域范围初始化，补充优化参数默认值与GPU梯度内存
     * @param num_points：点集总数量（N）
     * @param domain_ranges：各维度域范围（如2D为{width, height}，传给基类）
     * @throw invalid_argument：维度超出1~32范围时抛出
     */
    GBNPointSet(int num_points, const vector<Float>& domain_ranges = {});

    /**
     * 析构函数：释放GPU梯度数组（基类自动释放自身管理的GPU资源）
     */
    ~GBNPointSet();


    // ================================= 核心功能：优化成员函数 =================================
    /**
     * 内化优化函数：复用基类参数（点集规模、环形域、快照路径等），完成梯度下降
     * @throw invalid_argument：输入参数非法（点集大小不匹配、sigma≤0等）
     * @throw runtime_error：CUDA执行错误
     */
    void optimize();

    // ================================= 辅助接口（复用基类，仅补充必要扩展） =================================
    /**
     * 手动释放GPU梯度资源（可选，析构函数会自动调用）
     */
    void freeDeviceGradients();


private:
    // ================================= 私有成员变量（仅保留基类未包含的） =================================
    Float* d_gradients_;  // GPU端梯度数组（基类未管理，需自行分配/释放）


    // ================================= 私有辅助函数（封装内部逻辑） =================================
    /**
     * 初始化GPU梯度数组内存
     * @throw runtime_error：CUDA内存分配失败时抛出
     */
    void initDeviceGradients();

    /**
     * 输入参数校验
     * @throw invalid_argument：参数非法时抛出
     */
    void validateOptimizeInput() const;

};

#endif  // GBN_CUDA_CUH